import json
import logging
from django.http import JsonResponse
from django.utils.deprecation import MiddlewareMixin
from util.myrediss import r
from util.myjwt import myjwt

logger = logging.getLogger(__name__)

class AdminAuthMiddleware(MiddlewareMixin):
    """
    管理员认证中间件
    
    功能:
        1. 验证请求头中的token是否有效
        2. 从token中解析管理员信息
        3. 将管理员信息添加到request对象中
        4. 对需要认证的路径进行权限验证
    """
    
    # 不需要认证的路径
    EXEMPT_PATHS = [
        '/manage/login/',
        '/manage/image-code/',
        '/manage/send-code/',
    ]

    # 不需要认证的路径前缀
    EXEMPT_PATH_PREFIXES = [
        '/manage/workflow',  # 工作流相关的所有路径
        'uploads' ,#图片相关的
    ]
    
    def process_request(self, request):
        # 获取当前请求路径
        path = request.path
        if path.startswith('/uploads/'):
            return None
        # 如果不是管理后台路径，直接放行，不做任何处理
        if not path.startswith('/manage/'):
            return None
        
        # 打印调试信息
        logger.info(f"AdminAuthMiddleware处理路径: {path}")
        
        # 如果是不需要认证的管理后台路径，直接放行
        for exempt_path in self.EXEMPT_PATHS:
            if path.endswith(exempt_path) or path == exempt_path:
                logger.info(f"路径 {path} 无需认证，直接放行")
                return None
                
        # 检查路径前缀
        for prefix in self.EXEMPT_PATH_PREFIXES:
            if path.startswith(prefix):
                logger.info(f"路径 {path} 以 {prefix} 开头，无需认证，直接放行")
                return None
            
        # 获取token
        token = request.headers.get('Authorization')
        if not token:
            return JsonResponse({'code': 401, 'message': '未登录'})
            
        # 去掉可能的Bearer前缀
        if token.startswith('Bearer '):
            token = token[7:]
            
        # 验证token
        try:
            # 解析token
            payload = myjwt.decode(token)
            
            # 检查是否是管理员token
            if not payload.get('is_admin'):
                return JsonResponse({'code': 403, 'message': '非管理员用户'})
                
            # 获取用户ID
            user_id = payload.get('userid')
            if not user_id:
                return JsonResponse({'code': 401, 'message': '无效的token'})
                
            # 检查redis中是否存在该token（用于判断是否已退出登录）
            stored_token = r.get_value(f'admin_token_{user_id}')
            if not stored_token or stored_token.decode() != token:
                return JsonResponse({'code': 401, 'message': '登录已过期，请重新登录'})
                
            # 将用户信息添加到request对象中
            request.admin_info = payload
            
        except Exception as e:
            logger.error(f"验证管理员token失败: {str(e)}")
            return JsonResponse({'code': 401, 'message': '登录已过期，请重新登录'})
            
        return None 